


<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <script type="text/javascript">

      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-90545585-1']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
    </script>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>torchvision.models.detection.keypoint_rcnn &mdash; Torchvision master documentation</title>
  

  
  
  
  

  

  
  
    

  

  <link rel="stylesheet" href="../../../../_static/css/theme.css" type="text/css" />
  <!-- <link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" /> -->
    <link rel="index" title="Index" href="../../../../genindex.html" />
    <link rel="search" title="Search" href="../../../../search.html" /> 

  
  <script src="../../../../_static/js/modernizr.min.js"></script>

  <!-- Preload the theme fonts -->

<link rel="preload" href="../../../../_static/fonts/FreightSans/freight-sans-book.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="../../../../_static/fonts/FreightSans/freight-sans-medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="../../../../_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="../../../../_static/fonts/FreightSans/freight-sans-bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="../../../../_static/fonts/FreightSans/freight-sans-medium-italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="../../../../_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2" as="font" type="font/woff2" crossorigin="anonymous">

<!-- Preload the katex fonts -->

<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Math-Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Main-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Main-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size1-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size4-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size2-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size3-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Caligraphic-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
</head>

<div class="container-fluid header-holder tutorials-header" id="header-holder">
  <div class="container">
    <div class="header-container">
      <a class="header-logo" href="https://pytorch.org/" aria-label="PyTorch"></a>

      <div class="main-menu">
        <ul>
          <li>
            <a href="https://pytorch.org/get-started">Get Started</a>
          </li>

          <li>
            <div class="ecosystem-dropdown">
              <a id="dropdownMenuButton" data-toggle="ecosystem-dropdown">
                Ecosystem
              </a>
              <div class="ecosystem-dropdown-menu">
                <a class="nav-dropdown-item" href="https://pytorch.org/hub"">
                  <span class=dropdown-title>Models (Beta)</span>
                  <p>Discover, publish, and reuse pre-trained models</p>
                </a>
                <a class="nav-dropdown-item" href="https://pytorch.org/ecosystem">
                  <span class=dropdown-title>Tools & Libraries</span>
                  <p>Explore the ecosystem of tools and libraries</p>
                </a>
              </div>
            </div>
          </li>

          <li>
            <a href="https://pytorch.org/mobile">Mobile</a>
          </li>

          <li>
            <a href="https://pytorch.org/blog/">Blog</a>
          </li>

          <li>
            <a href="https://pytorch.org/tutorials">Tutorials</a>
          </li>

          <li class="active">
            <a href="https://pytorch.org/docs/stable/index.html">Docs</a>
          </li>

          <li>
            <div class="resources-dropdown">
              <a id="resourcesDropdownButton" data-toggle="resources-dropdown">
                Resources
              </a>
              <div class="resources-dropdown-menu">
                <a class="nav-dropdown-item" href="https://pytorch.org/resources"">
                  <span class=dropdown-title>Developer Resources</span>
                  <p>Find resources and get questions answered</p>
                </a>
                <a class="nav-dropdown-item" href="https://pytorch.org/features">
                  <span class=dropdown-title>About</span>
                  <p>Learn about PyTorch’s features and capabilities</p>
                </a>
              </div>
            </div>
          </li>

          <li>
            <a href="https://github.com/pytorch/pytorch">Github</a>
          </li>
        </ul>
      </div>

      <a class="main-menu-open-button" href="#" data-behavior="open-mobile-menu"></a>
    </div>

  </div>
</div>


<body class="pytorch-body">

   

    

    <div class="table-of-contents-link-wrapper">
      <span>Table of Contents</span>
      <a href="#" class="toggle-table-of-contents" data-behavior="toggle-table-of-contents"></a>
    </div>

    <nav data-toggle="wy-nav-shift" class="pytorch-left-menu" id="pytorch-left-menu">
      <div class="pytorch-side-scroll">
        <div class="pytorch-menu pytorch-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          <div class="pytorch-left-menu-search">
            

            
              
              
                <div class="version">
                  master (0.6.0 )
                </div>
              
            

            


  


<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
    <input type="text" name="q" placeholder="Search Docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

            
          </div>

          
            
            
              
            
            
              <p class="caption"><span class="caption-text">Package Reference</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../datasets.html">torchvision.datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../io.html">torchvision.io</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../models.html">torchvision.models</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../ops.html">torchvision.ops</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../transforms.html">torchvision.transforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../utils.html">torchvision.utils</a></li>
</ul>

            
          
        </div>
      </div>
    </nav>

    <div class="pytorch-container">
      <div class="pytorch-page-level-bar" id="pytorch-page-level-bar">
        <div class="pytorch-breadcrumbs-wrapper">
          















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="pytorch-breadcrumbs">
    
      <li>
        <a href="../../../../index.html">
          
            Docs
          
        </a> &gt;
      </li>

        
          <li><a href="../../../index.html">Module code</a> &gt;</li>
        
          <li><a href="../../../torchvision.html">torchvision</a> &gt;</li>
        
      <li>torchvision.models.detection.keypoint_rcnn</li>
    
    
      <li class="pytorch-breadcrumbs-aside">
        
      </li>
    
  </ul>

  
</div>
        </div>

        <div class="pytorch-shortcuts-wrapper" id="pytorch-shortcuts-wrapper">
          Shortcuts
        </div>
      </div>

      <section data-toggle="wy-nav-shift" id="pytorch-content-wrap" class="pytorch-content-wrap">
        <div class="pytorch-content-left">

        
          
          <div class="rst-content">
          
            <div role="main" class="main-content" itemscope="itemscope" itemtype="http://schema.org/Article">
             <article itemprop="articleBody" id="pytorch-article" class="pytorch-article">
              
  <h1>Source code for torchvision.models.detection.keypoint_rcnn</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">from</span> <span class="nn">torch</span> <span class="kn">import</span> <span class="n">nn</span>

<span class="kn">from</span> <span class="nn">torchvision.ops</span> <span class="kn">import</span> <span class="n">misc</span> <span class="k">as</span> <span class="n">misc_nn_ops</span>

<span class="kn">from</span> <span class="nn">torchvision.ops</span> <span class="kn">import</span> <span class="n">MultiScaleRoIAlign</span>

<span class="kn">from</span> <span class="nn">..utils</span> <span class="kn">import</span> <span class="n">load_state_dict_from_url</span>

<span class="kn">from</span> <span class="nn">.faster_rcnn</span> <span class="kn">import</span> <span class="n">FasterRCNN</span>
<span class="kn">from</span> <span class="nn">.backbone_utils</span> <span class="kn">import</span> <span class="n">resnet_fpn_backbone</span>


<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s2">&quot;KeypointRCNN&quot;</span><span class="p">,</span> <span class="s2">&quot;keypointrcnn_resnet50_fpn&quot;</span>
<span class="p">]</span>


<span class="k">class</span> <span class="nc">KeypointRCNN</span><span class="p">(</span><span class="n">FasterRCNN</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Implements Keypoint R-CNN.</span>

<span class="sd">    The input to the model is expected to be a list of tensors, each of shape [C, H, W], one for each</span>
<span class="sd">    image, and should be in 0-1 range. Different images can have different sizes.</span>

<span class="sd">    The behavior of the model changes depending if it is in training or evaluation mode.</span>

<span class="sd">    During training, the model expects both the input tensors, as well as a targets (list of dictionary),</span>
<span class="sd">    containing:</span>
<span class="sd">        - boxes (FloatTensor[N, 4]): the ground-truth boxes in [x1, y1, x2, y2] format, with values of x</span>
<span class="sd">          between 0 and W and values of y between 0 and H</span>
<span class="sd">        - labels (Int64Tensor[N]): the class label for each ground-truth box</span>
<span class="sd">        - keypoints (FloatTensor[N, K, 3]): the K keypoints location for each of the N instances, in the</span>
<span class="sd">          format [x, y, visibility], where visibility=0 means that the keypoint is not visible.</span>

<span class="sd">    The model returns a Dict[Tensor] during training, containing the classification and regression</span>
<span class="sd">    losses for both the RPN and the R-CNN, and the keypoint loss.</span>

<span class="sd">    During inference, the model requires only the input tensors, and returns the post-processed</span>
<span class="sd">    predictions as a List[Dict[Tensor]], one for each input image. The fields of the Dict are as</span>
<span class="sd">    follows:</span>
<span class="sd">        - boxes (FloatTensor[N, 4]): the predicted boxes in [x1, y1, x2, y2] format, with values of x</span>
<span class="sd">          between 0 and W and values of y between 0 and H</span>
<span class="sd">        - labels (Int64Tensor[N]): the predicted labels for each image</span>
<span class="sd">        - scores (Tensor[N]): the scores or each prediction</span>
<span class="sd">        - keypoints (FloatTensor[N, K, 3]): the locations of the predicted keypoints, in [x, y, v] format.</span>

<span class="sd">    Arguments:</span>
<span class="sd">        backbone (nn.Module): the network used to compute the features for the model.</span>
<span class="sd">            It should contain a out_channels attribute, which indicates the number of output</span>
<span class="sd">            channels that each feature map has (and it should be the same for all feature maps).</span>
<span class="sd">            The backbone should return a single Tensor or and OrderedDict[Tensor].</span>
<span class="sd">        num_classes (int): number of output classes of the model (including the background).</span>
<span class="sd">            If box_predictor is specified, num_classes should be None.</span>
<span class="sd">        min_size (int): minimum size of the image to be rescaled before feeding it to the backbone</span>
<span class="sd">        max_size (int): maximum size of the image to be rescaled before feeding it to the backbone</span>
<span class="sd">        image_mean (Tuple[float, float, float]): mean values used for input normalization.</span>
<span class="sd">            They are generally the mean values of the dataset on which the backbone has been trained</span>
<span class="sd">            on</span>
<span class="sd">        image_std (Tuple[float, float, float]): std values used for input normalization.</span>
<span class="sd">            They are generally the std values of the dataset on which the backbone has been trained on</span>
<span class="sd">        rpn_anchor_generator (AnchorGenerator): module that generates the anchors for a set of feature</span>
<span class="sd">            maps.</span>
<span class="sd">        rpn_head (nn.Module): module that computes the objectness and regression deltas from the RPN</span>
<span class="sd">        rpn_pre_nms_top_n_train (int): number of proposals to keep before applying NMS during training</span>
<span class="sd">        rpn_pre_nms_top_n_test (int): number of proposals to keep before applying NMS during testing</span>
<span class="sd">        rpn_post_nms_top_n_train (int): number of proposals to keep after applying NMS during training</span>
<span class="sd">        rpn_post_nms_top_n_test (int): number of proposals to keep after applying NMS during testing</span>
<span class="sd">        rpn_nms_thresh (float): NMS threshold used for postprocessing the RPN proposals</span>
<span class="sd">        rpn_fg_iou_thresh (float): minimum IoU between the anchor and the GT box so that they can be</span>
<span class="sd">            considered as positive during training of the RPN.</span>
<span class="sd">        rpn_bg_iou_thresh (float): maximum IoU between the anchor and the GT box so that they can be</span>
<span class="sd">            considered as negative during training of the RPN.</span>
<span class="sd">        rpn_batch_size_per_image (int): number of anchors that are sampled during training of the RPN</span>
<span class="sd">            for computing the loss</span>
<span class="sd">        rpn_positive_fraction (float): proportion of positive anchors in a mini-batch during training</span>
<span class="sd">            of the RPN</span>
<span class="sd">        box_roi_pool (MultiScaleRoIAlign): the module which crops and resizes the feature maps in</span>
<span class="sd">            the locations indicated by the bounding boxes</span>
<span class="sd">        box_head (nn.Module): module that takes the cropped feature maps as input</span>
<span class="sd">        box_predictor (nn.Module): module that takes the output of box_head and returns the</span>
<span class="sd">            classification logits and box regression deltas.</span>
<span class="sd">        box_score_thresh (float): during inference, only return proposals with a classification score</span>
<span class="sd">            greater than box_score_thresh</span>
<span class="sd">        box_nms_thresh (float): NMS threshold for the prediction head. Used during inference</span>
<span class="sd">        box_detections_per_img (int): maximum number of detections per image, for all classes.</span>
<span class="sd">        box_fg_iou_thresh (float): minimum IoU between the proposals and the GT box so that they can be</span>
<span class="sd">            considered as positive during training of the classification head</span>
<span class="sd">        box_bg_iou_thresh (float): maximum IoU between the proposals and the GT box so that they can be</span>
<span class="sd">            considered as negative during training of the classification head</span>
<span class="sd">        box_batch_size_per_image (int): number of proposals that are sampled during training of the</span>
<span class="sd">            classification head</span>
<span class="sd">        box_positive_fraction (float): proportion of positive proposals in a mini-batch during training</span>
<span class="sd">            of the classification head</span>
<span class="sd">        bbox_reg_weights (Tuple[float, float, float, float]): weights for the encoding/decoding of the</span>
<span class="sd">            bounding boxes</span>
<span class="sd">        keypoint_roi_pool (MultiScaleRoIAlign): the module which crops and resizes the feature maps in</span>
<span class="sd">             the locations indicated by the bounding boxes, which will be used for the keypoint head.</span>
<span class="sd">        keypoint_head (nn.Module): module that takes the cropped feature maps as input</span>
<span class="sd">        keypoint_predictor (nn.Module): module that takes the output of the keypoint_head and returns the</span>
<span class="sd">            heatmap logits</span>

<span class="sd">    Example::</span>

<span class="sd">        &gt;&gt;&gt; import torch</span>
<span class="sd">        &gt;&gt;&gt; import torchvision</span>
<span class="sd">        &gt;&gt;&gt; from torchvision.models.detection import KeypointRCNN</span>
<span class="sd">        &gt;&gt;&gt; from torchvision.models.detection.rpn import AnchorGenerator</span>
<span class="sd">        &gt;&gt;&gt;</span>
<span class="sd">        &gt;&gt;&gt; # load a pre-trained model for classification and return</span>
<span class="sd">        &gt;&gt;&gt; # only the features</span>
<span class="sd">        &gt;&gt;&gt; backbone = torchvision.models.mobilenet_v2(pretrained=True).features</span>
<span class="sd">        &gt;&gt;&gt; # KeypointRCNN needs to know the number of</span>
<span class="sd">        &gt;&gt;&gt; # output channels in a backbone. For mobilenet_v2, it&#39;s 1280</span>
<span class="sd">        &gt;&gt;&gt; # so we need to add it here</span>
<span class="sd">        &gt;&gt;&gt; backbone.out_channels = 1280</span>
<span class="sd">        &gt;&gt;&gt;</span>
<span class="sd">        &gt;&gt;&gt; # let&#39;s make the RPN generate 5 x 3 anchors per spatial</span>
<span class="sd">        &gt;&gt;&gt; # location, with 5 different sizes and 3 different aspect</span>
<span class="sd">        &gt;&gt;&gt; # ratios. We have a Tuple[Tuple[int]] because each feature</span>
<span class="sd">        &gt;&gt;&gt; # map could potentially have different sizes and</span>
<span class="sd">        &gt;&gt;&gt; # aspect ratios</span>
<span class="sd">        &gt;&gt;&gt; anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),</span>
<span class="sd">        &gt;&gt;&gt;                                    aspect_ratios=((0.5, 1.0, 2.0),))</span>
<span class="sd">        &gt;&gt;&gt;</span>
<span class="sd">        &gt;&gt;&gt; # let&#39;s define what are the feature maps that we will</span>
<span class="sd">        &gt;&gt;&gt; # use to perform the region of interest cropping, as well as</span>
<span class="sd">        &gt;&gt;&gt; # the size of the crop after rescaling.</span>
<span class="sd">        &gt;&gt;&gt; # if your backbone returns a Tensor, featmap_names is expected to</span>
<span class="sd">        &gt;&gt;&gt; # be [&#39;0&#39;]. More generally, the backbone should return an</span>
<span class="sd">        &gt;&gt;&gt; # OrderedDict[Tensor], and in featmap_names you can choose which</span>
<span class="sd">        &gt;&gt;&gt; # feature maps to use.</span>
<span class="sd">        &gt;&gt;&gt; roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=[&#39;0&#39;],</span>
<span class="sd">        &gt;&gt;&gt;                                                 output_size=7,</span>
<span class="sd">        &gt;&gt;&gt;                                                 sampling_ratio=2)</span>
<span class="sd">        &gt;&gt;&gt;</span>
<span class="sd">        &gt;&gt;&gt; keypoint_roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=[&#39;0&#39;],</span>
<span class="sd">        &gt;&gt;&gt;                                                          output_size=14,</span>
<span class="sd">        &gt;&gt;&gt;                                                          sampling_ratio=2)</span>
<span class="sd">        &gt;&gt;&gt; # put the pieces together inside a KeypointRCNN model</span>
<span class="sd">        &gt;&gt;&gt; model = KeypointRCNN(backbone,</span>
<span class="sd">        &gt;&gt;&gt;                      num_classes=2,</span>
<span class="sd">        &gt;&gt;&gt;                      rpn_anchor_generator=anchor_generator,</span>
<span class="sd">        &gt;&gt;&gt;                      box_roi_pool=roi_pooler,</span>
<span class="sd">        &gt;&gt;&gt;                      keypoint_roi_pool=keypoint_roi_pooler)</span>
<span class="sd">        &gt;&gt;&gt; model.eval()</span>
<span class="sd">        &gt;&gt;&gt; model.eval()</span>
<span class="sd">        &gt;&gt;&gt; x = [torch.rand(3, 300, 400), torch.rand(3, 500, 400)]</span>
<span class="sd">        &gt;&gt;&gt; predictions = model(x)</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">backbone</span><span class="p">,</span> <span class="n">num_classes</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="c1"># transform parameters</span>
                 <span class="n">min_size</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">max_size</span><span class="o">=</span><span class="mi">1333</span><span class="p">,</span>
                 <span class="n">image_mean</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">image_std</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="c1"># RPN parameters</span>
                 <span class="n">rpn_anchor_generator</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">rpn_head</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="n">rpn_pre_nms_top_n_train</span><span class="o">=</span><span class="mi">2000</span><span class="p">,</span> <span class="n">rpn_pre_nms_top_n_test</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
                 <span class="n">rpn_post_nms_top_n_train</span><span class="o">=</span><span class="mi">2000</span><span class="p">,</span> <span class="n">rpn_post_nms_top_n_test</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
                 <span class="n">rpn_nms_thresh</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span>
                 <span class="n">rpn_fg_iou_thresh</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">rpn_bg_iou_thresh</span><span class="o">=</span><span class="mf">0.3</span><span class="p">,</span>
                 <span class="n">rpn_batch_size_per_image</span><span class="o">=</span><span class="mi">256</span><span class="p">,</span> <span class="n">rpn_positive_fraction</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
                 <span class="c1"># Box parameters</span>
                 <span class="n">box_roi_pool</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">box_head</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">box_predictor</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="n">box_score_thresh</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">box_nms_thresh</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">box_detections_per_img</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
                 <span class="n">box_fg_iou_thresh</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">box_bg_iou_thresh</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
                 <span class="n">box_batch_size_per_image</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span> <span class="n">box_positive_fraction</span><span class="o">=</span><span class="mf">0.25</span><span class="p">,</span>
                 <span class="n">bbox_reg_weights</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="c1"># keypoint parameters</span>
                 <span class="n">keypoint_roi_pool</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">keypoint_head</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">keypoint_predictor</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="n">num_keypoints</span><span class="o">=</span><span class="mi">17</span><span class="p">):</span>

        <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keypoint_roi_pool</span><span class="p">,</span> <span class="p">(</span><span class="n">MultiScaleRoIAlign</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="kc">None</span><span class="p">)))</span>
        <span class="k">if</span> <span class="n">min_size</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">min_size</span> <span class="o">=</span> <span class="p">(</span><span class="mi">640</span><span class="p">,</span> <span class="mi">672</span><span class="p">,</span> <span class="mi">704</span><span class="p">,</span> <span class="mi">736</span><span class="p">,</span> <span class="mi">768</span><span class="p">,</span> <span class="mi">800</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">num_classes</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">keypoint_predictor</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;num_classes should be None when keypoint_predictor is specified&quot;</span><span class="p">)</span>

        <span class="n">out_channels</span> <span class="o">=</span> <span class="n">backbone</span><span class="o">.</span><span class="n">out_channels</span>

        <span class="k">if</span> <span class="n">keypoint_roi_pool</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">keypoint_roi_pool</span> <span class="o">=</span> <span class="n">MultiScaleRoIAlign</span><span class="p">(</span>
                <span class="n">featmap_names</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;2&#39;</span><span class="p">,</span> <span class="s1">&#39;3&#39;</span><span class="p">],</span>
                <span class="n">output_size</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span>
                <span class="n">sampling_ratio</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">keypoint_head</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">keypoint_layers</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="mi">512</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">))</span>
            <span class="n">keypoint_head</span> <span class="o">=</span> <span class="n">KeypointRCNNHeads</span><span class="p">(</span><span class="n">out_channels</span><span class="p">,</span> <span class="n">keypoint_layers</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">keypoint_predictor</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">keypoint_dim_reduced</span> <span class="o">=</span> <span class="mi">512</span>  <span class="c1"># == keypoint_layers[-1]</span>
            <span class="n">keypoint_predictor</span> <span class="o">=</span> <span class="n">KeypointRCNNPredictor</span><span class="p">(</span><span class="n">keypoint_dim_reduced</span><span class="p">,</span> <span class="n">num_keypoints</span><span class="p">)</span>

        <span class="nb">super</span><span class="p">(</span><span class="n">KeypointRCNN</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
            <span class="n">backbone</span><span class="p">,</span> <span class="n">num_classes</span><span class="p">,</span>
            <span class="c1"># transform parameters</span>
            <span class="n">min_size</span><span class="p">,</span> <span class="n">max_size</span><span class="p">,</span>
            <span class="n">image_mean</span><span class="p">,</span> <span class="n">image_std</span><span class="p">,</span>
            <span class="c1"># RPN-specific parameters</span>
            <span class="n">rpn_anchor_generator</span><span class="p">,</span> <span class="n">rpn_head</span><span class="p">,</span>
            <span class="n">rpn_pre_nms_top_n_train</span><span class="p">,</span> <span class="n">rpn_pre_nms_top_n_test</span><span class="p">,</span>
            <span class="n">rpn_post_nms_top_n_train</span><span class="p">,</span> <span class="n">rpn_post_nms_top_n_test</span><span class="p">,</span>
            <span class="n">rpn_nms_thresh</span><span class="p">,</span>
            <span class="n">rpn_fg_iou_thresh</span><span class="p">,</span> <span class="n">rpn_bg_iou_thresh</span><span class="p">,</span>
            <span class="n">rpn_batch_size_per_image</span><span class="p">,</span> <span class="n">rpn_positive_fraction</span><span class="p">,</span>
            <span class="c1"># Box parameters</span>
            <span class="n">box_roi_pool</span><span class="p">,</span> <span class="n">box_head</span><span class="p">,</span> <span class="n">box_predictor</span><span class="p">,</span>
            <span class="n">box_score_thresh</span><span class="p">,</span> <span class="n">box_nms_thresh</span><span class="p">,</span> <span class="n">box_detections_per_img</span><span class="p">,</span>
            <span class="n">box_fg_iou_thresh</span><span class="p">,</span> <span class="n">box_bg_iou_thresh</span><span class="p">,</span>
            <span class="n">box_batch_size_per_image</span><span class="p">,</span> <span class="n">box_positive_fraction</span><span class="p">,</span>
            <span class="n">bbox_reg_weights</span><span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">roi_heads</span><span class="o">.</span><span class="n">keypoint_roi_pool</span> <span class="o">=</span> <span class="n">keypoint_roi_pool</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">roi_heads</span><span class="o">.</span><span class="n">keypoint_head</span> <span class="o">=</span> <span class="n">keypoint_head</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">roi_heads</span><span class="o">.</span><span class="n">keypoint_predictor</span> <span class="o">=</span> <span class="n">keypoint_predictor</span>


<span class="k">class</span> <span class="nc">KeypointRCNNHeads</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Sequential</span><span class="p">):</span>
    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">in_channels</span><span class="p">,</span> <span class="n">layers</span><span class="p">):</span>
        <span class="n">d</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">next_feature</span> <span class="o">=</span> <span class="n">in_channels</span>
        <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">layers</span><span class="p">:</span>
            <span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">misc_nn_ops</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="n">next_feature</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
            <span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">ReLU</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
            <span class="n">next_feature</span> <span class="o">=</span> <span class="n">l</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">KeypointRCNNHeads</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">d</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">():</span>
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">misc_nn_ops</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">):</span>
                <span class="n">nn</span><span class="o">.</span><span class="n">init</span><span class="o">.</span><span class="n">kaiming_normal_</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">weight</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;fan_out&quot;</span><span class="p">,</span> <span class="n">nonlinearity</span><span class="o">=</span><span class="s2">&quot;relu&quot;</span><span class="p">)</span>
                <span class="n">nn</span><span class="o">.</span><span class="n">init</span><span class="o">.</span><span class="n">constant_</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">bias</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>


<span class="k">class</span> <span class="nc">KeypointRCNNPredictor</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">in_channels</span><span class="p">,</span> <span class="n">num_keypoints</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">KeypointRCNNPredictor</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
        <span class="n">input_features</span> <span class="o">=</span> <span class="n">in_channels</span>
        <span class="n">deconv_kernel</span> <span class="o">=</span> <span class="mi">4</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">kps_score_lowres</span> <span class="o">=</span> <span class="n">misc_nn_ops</span><span class="o">.</span><span class="n">ConvTranspose2d</span><span class="p">(</span>
            <span class="n">input_features</span><span class="p">,</span>
            <span class="n">num_keypoints</span><span class="p">,</span>
            <span class="n">deconv_kernel</span><span class="p">,</span>
            <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
            <span class="n">padding</span><span class="o">=</span><span class="n">deconv_kernel</span> <span class="o">//</span> <span class="mi">2</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
        <span class="p">)</span>
        <span class="n">nn</span><span class="o">.</span><span class="n">init</span><span class="o">.</span><span class="n">kaiming_normal_</span><span class="p">(</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">kps_score_lowres</span><span class="o">.</span><span class="n">weight</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;fan_out&quot;</span><span class="p">,</span> <span class="n">nonlinearity</span><span class="o">=</span><span class="s2">&quot;relu&quot;</span>
        <span class="p">)</span>
        <span class="n">nn</span><span class="o">.</span><span class="n">init</span><span class="o">.</span><span class="n">constant_</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">kps_score_lowres</span><span class="o">.</span><span class="n">bias</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">up_scale</span> <span class="o">=</span> <span class="mi">2</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">out_channels</span> <span class="o">=</span> <span class="n">num_keypoints</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">kps_score_lowres</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">misc_nn_ops</span><span class="o">.</span><span class="n">interpolate</span><span class="p">(</span>
            <span class="n">x</span><span class="p">,</span> <span class="n">scale_factor</span><span class="o">=</span><span class="nb">float</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">up_scale</span><span class="p">),</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;bilinear&quot;</span><span class="p">,</span> <span class="n">align_corners</span><span class="o">=</span><span class="kc">False</span>
        <span class="p">)</span>
        <span class="k">return</span> <span class="n">x</span>


<span class="n">model_urls</span> <span class="o">=</span> <span class="p">{</span>
    <span class="c1"># legacy model for BC reasons, see https://github.com/pytorch/vision/issues/1606</span>
    <span class="s1">&#39;keypointrcnn_resnet50_fpn_coco_legacy&#39;</span><span class="p">:</span>
        <span class="s1">&#39;https://download.pytorch.org/models/keypointrcnn_resnet50_fpn_coco-9f466800.pth&#39;</span><span class="p">,</span>
    <span class="s1">&#39;keypointrcnn_resnet50_fpn_coco&#39;</span><span class="p">:</span>
        <span class="s1">&#39;https://download.pytorch.org/models/keypointrcnn_resnet50_fpn_coco-fc266e95.pth&#39;</span><span class="p">,</span>
<span class="p">}</span>


<div class="viewcode-block" id="keypointrcnn_resnet50_fpn"><a class="viewcode-back" href="../../../../models.html#torchvision.models.detection.keypointrcnn_resnet50_fpn">[docs]</a><span class="k">def</span> <span class="nf">keypointrcnn_resnet50_fpn</span><span class="p">(</span><span class="n">pretrained</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">progress</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
                              <span class="n">num_classes</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">num_keypoints</span><span class="o">=</span><span class="mi">17</span><span class="p">,</span>
                              <span class="n">pretrained_backbone</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Constructs a Keypoint R-CNN model with a ResNet-50-FPN backbone.</span>

<span class="sd">    The input to the model is expected to be a list of tensors, each of shape ``[C, H, W]``, one for each</span>
<span class="sd">    image, and should be in ``0-1`` range. Different images can have different sizes.</span>

<span class="sd">    The behavior of the model changes depending if it is in training or evaluation mode.</span>

<span class="sd">    During training, the model expects both the input tensors, as well as a targets (list of dictionary),</span>
<span class="sd">    containing:</span>
<span class="sd">        - boxes (``FloatTensor[N, 4]``): the ground-truth boxes in ``[x1, y1, x2, y2]`` format, with values of ``x``</span>
<span class="sd">          between ``0`` and ``W`` and values of ``y`` between ``0`` and ``H``</span>
<span class="sd">        - labels (``Int64Tensor[N]``): the class label for each ground-truth box</span>
<span class="sd">        - keypoints (``FloatTensor[N, K, 3]``): the ``K`` keypoints location for each of the ``N`` instances, in the</span>
<span class="sd">          format ``[x, y, visibility]``, where ``visibility=0`` means that the keypoint is not visible.</span>

<span class="sd">    The model returns a ``Dict[Tensor]`` during training, containing the classification and regression</span>
<span class="sd">    losses for both the RPN and the R-CNN, and the keypoint loss.</span>

<span class="sd">    During inference, the model requires only the input tensors, and returns the post-processed</span>
<span class="sd">    predictions as a ``List[Dict[Tensor]]``, one for each input image. The fields of the ``Dict`` are as</span>
<span class="sd">    follows:</span>
<span class="sd">        - boxes (``FloatTensor[N, 4]``): the predicted boxes in ``[x1, y1, x2, y2]`` format,  with values of ``x``</span>
<span class="sd">          between ``0`` and ``W`` and values of ``y`` between ``0`` and ``H``</span>
<span class="sd">        - labels (``Int64Tensor[N]``): the predicted labels for each image</span>
<span class="sd">        - scores (``Tensor[N]``): the scores or each prediction</span>
<span class="sd">        - keypoints (``FloatTensor[N, K, 3]``): the locations of the predicted keypoints, in ``[x, y, v]`` format.</span>

<span class="sd">    Keypoint R-CNN is exportable to ONNX for a fixed batch size with inputs images of fixed size.</span>

<span class="sd">    Example::</span>

<span class="sd">        &gt;&gt;&gt; model = torchvision.models.detection.keypointrcnn_resnet50_fpn(pretrained=True)</span>
<span class="sd">        &gt;&gt;&gt; model.eval()</span>
<span class="sd">        &gt;&gt;&gt; x = [torch.rand(3, 300, 400), torch.rand(3, 500, 400)]</span>
<span class="sd">        &gt;&gt;&gt; predictions = model(x)</span>
<span class="sd">        &gt;&gt;&gt;</span>
<span class="sd">        &gt;&gt;&gt; # optionally, if you want to export the model to ONNX:</span>
<span class="sd">        &gt;&gt;&gt; torch.onnx.export(model, x, &quot;keypoint_rcnn.onnx&quot;, opset_version = 11)</span>

<span class="sd">    Arguments:</span>
<span class="sd">        pretrained (bool): If True, returns a model pre-trained on COCO train2017</span>
<span class="sd">        progress (bool): If True, displays a progress bar of the download to stderr</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">if</span> <span class="n">pretrained</span><span class="p">:</span>
        <span class="c1"># no need to download the backbone if pretrained is set</span>
        <span class="n">pretrained_backbone</span> <span class="o">=</span> <span class="kc">False</span>
    <span class="n">backbone</span> <span class="o">=</span> <span class="n">resnet_fpn_backbone</span><span class="p">(</span><span class="s1">&#39;resnet50&#39;</span><span class="p">,</span> <span class="n">pretrained_backbone</span><span class="p">)</span>
    <span class="n">model</span> <span class="o">=</span> <span class="n">KeypointRCNN</span><span class="p">(</span><span class="n">backbone</span><span class="p">,</span> <span class="n">num_classes</span><span class="p">,</span> <span class="n">num_keypoints</span><span class="o">=</span><span class="n">num_keypoints</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">pretrained</span><span class="p">:</span>
        <span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;keypointrcnn_resnet50_fpn_coco&#39;</span>
        <span class="k">if</span> <span class="n">pretrained</span> <span class="o">==</span> <span class="s1">&#39;legacy&#39;</span><span class="p">:</span>
            <span class="n">key</span> <span class="o">+=</span> <span class="s1">&#39;_legacy&#39;</span>
        <span class="n">state_dict</span> <span class="o">=</span> <span class="n">load_state_dict_from_url</span><span class="p">(</span><span class="n">model_urls</span><span class="p">[</span><span class="n">key</span><span class="p">],</span>
                                              <span class="n">progress</span><span class="o">=</span><span class="n">progress</span><span class="p">)</span>
        <span class="n">model</span><span class="o">.</span><span class="n">load_state_dict</span><span class="p">(</span><span class="n">state_dict</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">model</span></div>
</pre></div>

             </article>
             
            </div>
            <footer>
  

  

    <hr>

  

  <div role="contentinfo">
    <p>
        &copy; Copyright 2017, Torch Contributors.

    </p>
  </div>
    
      <div>
        Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
      </div>
     

</footer>

          </div>
        </div>

        <div class="pytorch-content-right" id="pytorch-content-right">
          <div class="pytorch-right-menu" id="pytorch-right-menu">
            <div class="pytorch-side-scroll" id="pytorch-side-scroll-right">
              
            </div>
          </div>
        </div>
      </section>
    </div>

  


  

     
       <script type="text/javascript">
           var DOCUMENTATION_OPTIONS = {
               URL_ROOT:'../../../../',
               VERSION:'master',
               LANGUAGE:'None',
               COLLAPSE_INDEX:false,
               FILE_SUFFIX:'.html',
               HAS_SOURCE:  true,
               SOURCELINK_SUFFIX: '.txt'
           };
       </script>
         <script type="text/javascript" src="../../../../_static/jquery.js"></script>
         <script type="text/javascript" src="../../../../_static/underscore.js"></script>
         <script type="text/javascript" src="../../../../_static/doctools.js"></script>
         <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
     

  

  <script type="text/javascript" src="../../../../_static/js/vendor/popper.min.js"></script>
  <script type="text/javascript" src="../../../../_static/js/vendor/bootstrap.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/list.js/1.5.0/list.min.js"></script>
  <script type="text/javascript" src="../../../../_static/js/theme.js"></script>

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script> 

  <!-- Begin Footer -->

  <div class="container-fluid docs-tutorials-resources" id="docs-tutorials-resources">
    <div class="container">
      <div class="row">
        <div class="col-md-4 text-center">
          <h2>Docs</h2>
          <p>Access comprehensive developer documentation for PyTorch</p>
          <a class="with-right-arrow" href="https://pytorch.org/docs/stable/index.html">View Docs</a>
        </div>

        <div class="col-md-4 text-center">
          <h2>Tutorials</h2>
          <p>Get in-depth tutorials for beginners and advanced developers</p>
          <a class="with-right-arrow" href="https://pytorch.org/tutorials">View Tutorials</a>
        </div>

        <div class="col-md-4 text-center">
          <h2>Resources</h2>
          <p>Find development resources and get your questions answered</p>
          <a class="with-right-arrow" href="https://pytorch.org/resources">View Resources</a>
        </div>
      </div>
    </div>
  </div>

  <footer class="site-footer">
    <div class="container footer-container">
      <div class="footer-logo-wrapper">
        <a href="https://pytorch.org/" class="footer-logo"></a>
      </div>

      <div class="footer-links-wrapper">
        <div class="footer-links-col">
          <ul>
            <li class="list-title"><a href="https://pytorch.org/">PyTorch</a></li>
            <li><a href="https://pytorch.org/get-started">Get Started</a></li>
            <li><a href="https://pytorch.org/features">Features</a></li>
            <li><a href="https://pytorch.org/ecosystem">Ecosystem</a></li>
            <li><a href="https://pytorch.org/blog/">Blog</a></li>
            <li><a href="https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md">Contributing</a></li>
          </ul>
        </div>

        <div class="footer-links-col">
          <ul>
            <li class="list-title"><a href="https://pytorch.org/resources">Resources</a></li>
            <li><a href="https://pytorch.org/tutorials">Tutorials</a></li>
            <li><a href="https://pytorch.org/docs/stable/index.html">Docs</a></li>
            <li><a href="https://discuss.pytorch.org" target="_blank">Discuss</a></li>
            <li><a href="https://github.com/pytorch/pytorch/issues" target="_blank">Github Issues</a></li>
            <li><a href="https://pytorch.org/assets/brand-guidelines/PyTorch-Brand-Guidelines.pdf" target="_blank">Brand Guidelines</a></li>
          </ul>
        </div>

        <div class="footer-links-col follow-us-col">
          <ul>
            <li class="list-title">Stay Connected</li>
            <li>
              <div id="mc_embed_signup">
                <form
                  action="https://twitter.us14.list-manage.com/subscribe/post?u=75419c71fe0a935e53dfa4a3f&id=91d0dccd39"
                  method="post"
                  id="mc-embedded-subscribe-form"
                  name="mc-embedded-subscribe-form"
                  class="email-subscribe-form validate"
                  target="_blank"
                  novalidate>
                  <div id="mc_embed_signup_scroll" class="email-subscribe-form-fields-wrapper">
                    <div class="mc-field-group">
                      <label for="mce-EMAIL" style="display:none;">Email Address</label>
                      <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL" placeholder="Email Address">
                    </div>

                    <div id="mce-responses" class="clear">
                      <div class="response" id="mce-error-response" style="display:none"></div>
                      <div class="response" id="mce-success-response" style="display:none"></div>
                    </div>    <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->

                    <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_75419c71fe0a935e53dfa4a3f_91d0dccd39" tabindex="-1" value=""></div>

                    <div class="clear">
                      <input type="submit" value="" name="subscribe" id="mc-embedded-subscribe" class="button email-subscribe-button">
                    </div>
                  </div>
                </form>
              </div>

            </li>
          </ul>

          <div class="footer-social-icons">
            <a href="https://www.facebook.com/pytorch" target="_blank" class="facebook"></a>
            <a href="https://twitter.com/pytorch" target="_blank" class="twitter"></a>
            <a href="https://www.youtube.com/pytorch" target="_blank" class="youtube"></a>
          </div>
        </div>
      </div>
    </div>
  </footer>

  <div class="cookie-banner-wrapper">
  <div class="container">
    <p class="gdpr-notice">To analyze traffic and optimize your experience, we serve cookies on this site. By clicking or navigating, you agree to allow our usage of cookies. As the current maintainers of this site, Facebook’s Cookies Policy applies. Learn more, including about available controls: <a href="https://www.facebook.com/policies/cookies/">Cookies Policy</a>.</p>
    <img class="close-button" src="../../../../_static/images/pytorch-x.svg">
  </div>
</div>

  <!-- End Footer -->

  <!-- Begin Mobile Menu -->

  <div class="mobile-main-menu">
    <div class="container-fluid">
      <div class="container">
        <div class="mobile-main-menu-header-container">
          <a class="header-logo" href="https://pytorch.org/" aria-label="PyTorch"></a>
          <a class="main-menu-close-button" href="#" data-behavior="close-mobile-menu"></a>
        </div>
      </div>
    </div>

    <div class="mobile-main-menu-links-container">
      <div class="main-menu">
        <ul>
          <li>
            <a href="https://pytorch.org/get-started">Get Started</a>
          </li>

          <li>
            <a href="https://pytorch.org/features">Features</a>
          </li>

          <li>
            <a href="https://pytorch.org/ecosystem">Ecosystem</a>
          </li>

          <li>
            <a href="https://pytorch.org/mobile">Mobile</a>
          </li>

          <li>
            <a href="https://pytorch.org/hub">PyTorch Hub</a>
          </li>

          <li>
            <a href="https://pytorch.org/blog/">Blog</a>
          </li>

          <li>
            <a href="https://pytorch.org/tutorials">Tutorials</a>
          </li>

          <li class="active">
            <a href="https://pytorch.org/docs/stable/index.html">Docs</a>
          </li>

          <li>
            <a href="https://pytorch.org/resources">Resources</a>
          </li>

          <li>
            <a href="https://github.com/pytorch/pytorch">Github</a>
          </li>
        </ul>
      </div>
    </div>
  </div>

  <!-- End Mobile Menu -->

  <script type="text/javascript" src="../../../../_static/js/vendor/anchor.min.js"></script>

  <script type="text/javascript">
    $(document).ready(function() {
      mobileMenu.bind();
      mobileTOC.bind();
      pytorchAnchors.bind();
      sideMenus.bind();
      scrollToAnchor.bind();
      highlightNavigation.bind();
      mainMenuDropdown.bind();
      filterTags.bind();

      // Remove any empty p tags that Sphinx adds
      $("[data-tags='null']").remove();

      // Add class to links that have code blocks, since we cannot create links in code blocks
      $("article.pytorch-article a span.pre").each(function(e) {
        $(this).closest("a").addClass("has-code");
      });
    })
  </script>
</body>
</html>